using UnityEngine;
using System.Collections;
using DG.Tweening;
using UnityEngine.UI;

public class PixelBreathingEffect : MonoBehaviour
{
    public int width = 128;  // 建议使用较低分辨率
    public int height = 128;
    
    private Texture2D texture;
    private RawImage rawImage;

    // 每个周期更新新的随机目标值，每次过渡后启动下一次动画
    private void Start()
    {
        rawImage = GetComponent<RawImage>();
        if (rawImage == null)
        {
            Debug.LogError("RawImage 组件未找到！");
            return;
        }

        // 初始化纹理
        texture = new Texture2D(width, height);
        texture.wrapMode = TextureWrapMode.Clamp;
        rawImage.texture = texture;

        // 初始化所有像素为黑色
        Color[] initColors = new Color[width * height];
        for (int i = 0; i < initColors.Length; i++)
        {
            initColors[i] = Color.black;
        }
        texture.SetPixels(initColors);
        texture.Apply();

        // 启动循环协程
        StartCoroutine(UpdateAllPixels());
    }

    private IEnumerator UpdateAllPixels()
    {
        while (true)
        {
            // 对于每个像素，启动 DOTween 动画
            for (int i = 0; i < width * height; i++)
            {
                int pixelIndex = i;              // 捕获局部变量
                int pixelX = pixelIndex % width;   // 像素 x 坐标
                int pixelY = pixelIndex / width;   // 像素 y 坐标

                // 获取当前像素的亮度 (取 red 分量即可，因为 (r,r,r))
                Color currentColor = texture.GetPixel(pixelX, pixelY);
                float currentBrightness = currentColor.r;  // 范围 0～1

                // 根据权重生成目标亮度值（先生成 0～255 的值，再除以255）
                float targetBrightness = GenerateWeightedRandomBrightness() / 255f;

                // 随机过渡时间：5～10秒之间
                float duration = 5f;

                // 为当前像素启动 DOTween 动画
                DOTween.To(() => currentBrightness, x => {
                    currentBrightness = x;
                    // 更新该像素颜色
                    texture.SetPixel(pixelX, pixelY, new Color(x, x, x));
                }, targetBrightness, duration)
                .OnUpdate(() => {
                    // 每次更新时应用更改（这里可以考虑优化成批量更新）
                    texture.Apply();
                });
            }

            // 等待最长可能的过渡时间后启动下一轮更新
            // 这里使用10秒等待，因为每个动画的时长均不超过10秒
            yield return new WaitForSeconds(5f);
        }
    }

    /// <summary>
    /// 根据给定权重生成随机亮度（0～255）
    /// 权重：
    /// 5% : 固定0
    /// 25%: 10～30
    /// 30%: 31～50
    /// 40%: 10～70
    /// </summary>
    /// <returns>随机亮度值（0～255）</returns>
    private int GenerateWeightedRandomBrightness()
    {
        float r = Random.value;
        if (r < 0.05f)
        {
            return 0;
        }
        else if (r < 0.05f + 0.25f)
        {
            return Random.Range(10, 31);  // 上界不包含，所以使用31可取到30
        }
        else if (r < 0.05f + 0.25f + 0.30f)
        {
            return Random.Range(31, 51);
        }
        else // 剩余40%
        {
            return Random.Range(10, 71);
        }
    }
}
